refactor: simplified logic

pull/151/head
alestiago 4 years ago
parent 12ebb53eb0
commit 1ebea02742

@ -10,7 +10,6 @@ part 'game_state.dart';
class GameBloc extends Bloc<GameEvent, GameState> { class GameBloc extends Bloc<GameEvent, GameState> {
GameBloc() : super(const GameState.initial()) { GameBloc() : super(const GameState.initial()) {
on<BallLost>(_onBallLost); on<BallLost>(_onBallLost);
on<BonusBallLost>(_onBonusBallLost);
on<Scored>(_onScored); on<Scored>(_onScored);
on<BonusLetterActivated>(_onBonusLetterActivated); on<BonusLetterActivated>(_onBonusLetterActivated);
on<DashNestActivated>(_onDashNestActivated); on<DashNestActivated>(_onDashNestActivated);
@ -23,10 +22,6 @@ class GameBloc extends Bloc<GameEvent, GameState> {
emit(state.copyWith(balls: state.balls - 1)); emit(state.copyWith(balls: state.balls - 1));
} }
void _onBonusBallLost(BonusBallLost event, Emitter emit) {
emit(state.copyWith(bonusBalls: state.bonusBalls - 1));
}
void _onScored(Scored event, Emitter emit) { void _onScored(Scored event, Emitter emit) {
if (!state.isGameOver) { if (!state.isGameOver) {
emit(state.copyWith(score: state.score + event.points)); emit(state.copyWith(score: state.score + event.points));
@ -68,10 +63,6 @@ class GameBloc extends Bloc<GameEvent, GameState> {
if (achievedBonus) { if (achievedBonus) {
emit( emit(
state.copyWith( state.copyWith(
// TODO(alestiago): Question if we should have a private event
// _onBonusBallActivated() to avoid the duplication of code and
// split the logic.
bonusBalls: state.bonusBalls + 1,
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [ bonusHistory: [
...state.bonusHistory, ...state.bonusHistory,

@ -9,8 +9,6 @@ enum GameBonus {
word, word,
/// Bonus achieved when the user activates all dash nest bumpers. /// Bonus achieved when the user activates all dash nest bumpers.
///
/// Adds a [GameState.bonusBalls] to the game.
dashNest, dashNest,
} }
@ -22,18 +20,15 @@ class GameState extends Equatable {
const GameState({ const GameState({
required this.score, required this.score,
required this.balls, required this.balls,
required this.bonusBalls,
required this.activatedBonusLetters, required this.activatedBonusLetters,
required this.bonusHistory, required this.bonusHistory,
required this.activatedDashNests, required this.activatedDashNests,
}) : assert(score >= 0, "Score can't be negative"), }) : assert(score >= 0, "Score can't be negative"),
assert(balls >= 0, "Number of balls can't be negative"), assert(balls >= 0, "Number of balls can't be negative");
assert(bonusBalls >= 0, "Number of bonus balls can't be negative");
const GameState.initial() const GameState.initial()
: score = 0, : score = 0,
balls = 3, balls = 3,
bonusBalls = 0,
activatedBonusLetters = const [], activatedBonusLetters = const [],
activatedDashNests = const {}, activatedDashNests = const {},
bonusHistory = const []; bonusHistory = const [];
@ -46,12 +41,6 @@ class GameState extends Equatable {
/// When the number of balls is 0, the game is over. /// When the number of balls is 0, the game is over.
final int balls; final int balls;
/// The number of bonus balls in the game.
///
/// [bonusBalls] are gained during the game. For example, when a
/// [GameBonus.dashNest] is achieved.
final int bonusBalls;
/// Active bonus letters. /// Active bonus letters.
final List<int> activatedBonusLetters; final List<int> activatedBonusLetters;
@ -72,7 +61,6 @@ class GameState extends Equatable {
GameState copyWith({ GameState copyWith({
int? score, int? score,
int? balls, int? balls,
int? bonusBalls,
List<int>? activatedBonusLetters, List<int>? activatedBonusLetters,
Set<String>? activatedDashNests, Set<String>? activatedDashNests,
List<GameBonus>? bonusHistory, List<GameBonus>? bonusHistory,
@ -85,7 +73,6 @@ class GameState extends Equatable {
return GameState( return GameState(
score: score ?? this.score, score: score ?? this.score,
balls: balls ?? this.balls, balls: balls ?? this.balls,
bonusBalls: bonusBalls ?? this.bonusBalls,
activatedBonusLetters: activatedBonusLetters:
activatedBonusLetters ?? this.activatedBonusLetters, activatedBonusLetters ?? this.activatedBonusLetters,
activatedDashNests: activatedDashNests ?? this.activatedDashNests, activatedDashNests: activatedDashNests ?? this.activatedDashNests,
@ -97,7 +84,6 @@ class GameState extends Equatable {
List<Object?> get props => [ List<Object?> get props => [
score, score,
balls, balls,
bonusBalls,
activatedBonusLetters, activatedBonusLetters,
activatedDashNests, activatedDashNests,
bonusHistory, bonusHistory,

@ -33,7 +33,7 @@ class ControlledBall extends Ball with Controls<BallController> {
/// [Ball] used in [DebugPinballGame]. /// [Ball] used in [DebugPinballGame].
ControlledBall.debug() : super(baseColor: const Color(0xFFFF0000)) { ControlledBall.debug() : super(baseColor: const Color(0xFFFF0000)) {
controller = _DebugBallController(this); controller = BonusBallController(this);
} }
} }
@ -64,12 +64,6 @@ abstract class BallController extends ComponentController<Ball> {
class BonusBallController extends BallController with HasGameRef<PinballGame> { class BonusBallController extends BallController with HasGameRef<PinballGame> {
/// {@macro bonus_ball_controller} /// {@macro bonus_ball_controller}
BonusBallController(Ball<Forge2DGame> component) : super(component); BonusBallController(Ball<Forge2DGame> component) : super(component);
@override
void lost() {
super.lost();
gameRef.read<GameBloc>().add(const BonusBallLost());
}
} }
/// {@template launched_ball_controller} /// {@template launched_ball_controller}
@ -92,7 +86,3 @@ class LaunchedBallController extends BallController
gameRef.read<GameBloc>().add(const BallLost()); gameRef.read<GameBloc>().add(const BallLost());
} }
} }
class _DebugBallController extends BallController {
_DebugBallController(Ball<Forge2DGame> ball) : super(ball);
}

@ -59,13 +59,9 @@ class _FlutterForestController extends ComponentController<FlutterForest>
@override @override
bool listenWhen(GameState? previousState, GameState newState) { bool listenWhen(GameState? previousState, GameState newState) {
final gainedBonus = (previousState?.bonusHistory.length ?? 0) < return (previousState?.bonusHistory.length ?? 0) <
newState.bonusHistory.length && newState.bonusHistory.length &&
newState.bonusHistory.last == GameBonus.dashNest; newState.bonusHistory.last == GameBonus.dashNest;
final gainedBonusBall =
(previousState?.bonusBalls ?? 0) < newState.bonusBalls;
return gainedBonus && gainedBonusBall;
} }
@override @override

@ -21,7 +21,6 @@ void main() {
const GameState( const GameState(
score: 0, score: 0,
balls: 2, balls: 2,
bonusBalls: 0,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -30,38 +29,6 @@ void main() {
); );
}); });
group('BonusLostBall', () {
blocTest<GameBloc, GameState>(
'decreases number of balls',
build: GameBloc.new,
act: (bloc) {
for (var i = 0; i < 3; i++) {
bloc.add(DashNestActivated('$i'));
}
bloc.add(const BonusBallLost());
},
skip: 2,
expect: () => [
const GameState(
score: 0,
balls: 3,
bonusBalls: 1,
activatedBonusLetters: [],
activatedDashNests: {},
bonusHistory: [GameBonus.dashNest],
),
const GameState(
score: 0,
balls: 3,
bonusBalls: 0,
activatedBonusLetters: [],
activatedDashNests: {},
bonusHistory: [GameBonus.dashNest],
),
],
);
});
group('Scored', () { group('Scored', () {
blocTest<GameBloc, GameState>( blocTest<GameBloc, GameState>(
'increases score ' 'increases score '
@ -74,7 +41,6 @@ void main() {
const GameState( const GameState(
score: 2, score: 2,
balls: 3, balls: 3,
bonusBalls: 0,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -82,7 +48,6 @@ void main() {
const GameState( const GameState(
score: 5, score: 5,
balls: 3, balls: 3,
bonusBalls: 0,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -104,7 +69,6 @@ void main() {
const GameState( const GameState(
score: 0, score: 0,
balls: 2, balls: 2,
bonusBalls: 0,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -112,7 +76,6 @@ void main() {
const GameState( const GameState(
score: 0, score: 0,
balls: 1, balls: 1,
bonusBalls: 0,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -120,7 +83,6 @@ void main() {
const GameState( const GameState(
score: 0, score: 0,
balls: 0, balls: 0,
bonusBalls: 0,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -141,7 +103,6 @@ void main() {
GameState( GameState(
score: 0, score: 0,
balls: 3, balls: 3,
bonusBalls: 0,
activatedBonusLetters: [0], activatedBonusLetters: [0],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -149,7 +110,6 @@ void main() {
GameState( GameState(
score: 0, score: 0,
balls: 3, balls: 3,
bonusBalls: 0,
activatedBonusLetters: [0, 1], activatedBonusLetters: [0, 1],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -157,7 +117,6 @@ void main() {
GameState( GameState(
score: 0, score: 0,
balls: 3, balls: 3,
bonusBalls: 0,
activatedBonusLetters: [0, 1, 2], activatedBonusLetters: [0, 1, 2],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -179,7 +138,6 @@ void main() {
GameState( GameState(
score: 0, score: 0,
balls: 3, balls: 3,
bonusBalls: 0,
activatedBonusLetters: [0], activatedBonusLetters: [0],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -187,7 +145,6 @@ void main() {
GameState( GameState(
score: 0, score: 0,
balls: 3, balls: 3,
bonusBalls: 0,
activatedBonusLetters: [0, 1], activatedBonusLetters: [0, 1],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -195,7 +152,6 @@ void main() {
GameState( GameState(
score: 0, score: 0,
balls: 3, balls: 3,
bonusBalls: 0,
activatedBonusLetters: [0, 1, 2], activatedBonusLetters: [0, 1, 2],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -203,7 +159,6 @@ void main() {
GameState( GameState(
score: 0, score: 0,
balls: 3, balls: 3,
bonusBalls: 0,
activatedBonusLetters: [0, 1, 2, 3], activatedBonusLetters: [0, 1, 2, 3],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -211,7 +166,6 @@ void main() {
GameState( GameState(
score: 0, score: 0,
balls: 3, balls: 3,
bonusBalls: 0,
activatedBonusLetters: [0, 1, 2, 3, 4], activatedBonusLetters: [0, 1, 2, 3, 4],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -219,7 +173,6 @@ void main() {
GameState( GameState(
score: 0, score: 0,
balls: 3, balls: 3,
bonusBalls: 0,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [GameBonus.word], bonusHistory: [GameBonus.word],
@ -227,7 +180,6 @@ void main() {
GameState( GameState(
score: GameBloc.bonusWordScore, score: GameBloc.bonusWordScore,
balls: 3, balls: 3,
bonusBalls: 0,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [GameBonus.word], bonusHistory: [GameBonus.word],
@ -248,7 +200,6 @@ void main() {
GameState( GameState(
score: 0, score: 0,
balls: 3, balls: 3,
bonusBalls: 0,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {'0'}, activatedDashNests: {'0'},
bonusHistory: [], bonusHistory: [],
@ -256,7 +207,6 @@ void main() {
GameState( GameState(
score: 0, score: 0,
balls: 3, balls: 3,
bonusBalls: 0,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {'0', '1'}, activatedDashNests: {'0', '1'},
bonusHistory: [], bonusHistory: [],
@ -264,7 +214,6 @@ void main() {
GameState( GameState(
score: 0, score: 0,
balls: 3, balls: 3,
bonusBalls: 1,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [GameBonus.dashNest], bonusHistory: [GameBonus.dashNest],

@ -18,19 +18,6 @@ void main() {
}); });
}); });
group('BonusBallLost', () {
test('can be instantiated', () {
expect(const BonusBallLost(), isNotNull);
});
test('supports value equality', () {
expect(
BonusBallLost(),
equals(const BonusBallLost()),
);
});
});
group('Scored', () { group('Scored', () {
test('can be instantiated', () { test('can be instantiated', () {
expect(const Scored(points: 1), isNotNull); expect(const Scored(points: 1), isNotNull);

@ -10,7 +10,6 @@ void main() {
GameState( GameState(
score: 0, score: 0,
balls: 0, balls: 0,
bonusBalls: 0,
activatedBonusLetters: const [], activatedBonusLetters: const [],
activatedDashNests: const {}, activatedDashNests: const {},
bonusHistory: const [], bonusHistory: const [],
@ -19,7 +18,6 @@ void main() {
const GameState( const GameState(
score: 0, score: 0,
balls: 0, balls: 0,
bonusBalls: 0,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -34,7 +32,6 @@ void main() {
const GameState( const GameState(
score: 0, score: 0,
balls: 0, balls: 0,
bonusBalls: 0,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -52,25 +49,6 @@ void main() {
() => GameState( () => GameState(
balls: -1, balls: -1,
score: 0, score: 0,
bonusBalls: 0,
activatedBonusLetters: const [],
activatedDashNests: const {},
bonusHistory: const [],
),
throwsAssertionError,
);
},
);
test(
'throws AssertionError '
'when bonusBalls are negative',
() {
expect(
() => GameState(
balls: 0,
score: 0,
bonusBalls: -1,
activatedBonusLetters: const [], activatedBonusLetters: const [],
activatedDashNests: const {}, activatedDashNests: const {},
bonusHistory: const [], bonusHistory: const [],
@ -87,7 +65,6 @@ void main() {
expect( expect(
() => GameState( () => GameState(
balls: 0, balls: 0,
bonusBalls: 0,
score: -1, score: -1,
activatedBonusLetters: const [], activatedBonusLetters: const [],
activatedDashNests: const {}, activatedDashNests: const {},
@ -105,7 +82,6 @@ void main() {
const gameState = GameState( const gameState = GameState(
balls: 0, balls: 0,
score: 0, score: 0,
bonusBalls: 0,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -119,7 +95,6 @@ void main() {
const gameState = GameState( const gameState = GameState(
balls: 1, balls: 1,
score: 0, score: 0,
bonusBalls: 0,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -135,7 +110,6 @@ void main() {
const gameState = GameState( const gameState = GameState(
balls: 3, balls: 3,
score: 0, score: 0,
bonusBalls: 0,
activatedBonusLetters: [1], activatedBonusLetters: [1],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -150,7 +124,6 @@ void main() {
const gameState = GameState( const gameState = GameState(
balls: 3, balls: 3,
score: 0, score: 0,
bonusBalls: 0,
activatedBonusLetters: [1], activatedBonusLetters: [1],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -167,7 +140,6 @@ void main() {
() { () {
const gameState = GameState( const gameState = GameState(
balls: 0, balls: 0,
bonusBalls: 0,
score: 2, score: 2,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
@ -186,7 +158,6 @@ void main() {
() { () {
const gameState = GameState( const gameState = GameState(
balls: 0, balls: 0,
bonusBalls: 0,
score: 2, score: 2,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
@ -206,7 +177,6 @@ void main() {
const gameState = GameState( const gameState = GameState(
score: 2, score: 2,
balls: 0, balls: 0,
bonusBalls: 0,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -214,7 +184,6 @@ void main() {
final otherGameState = GameState( final otherGameState = GameState(
score: gameState.score + 1, score: gameState.score + 1,
balls: gameState.balls + 1, balls: gameState.balls + 1,
bonusBalls: gameState.bonusBalls + 1,
activatedBonusLetters: const [0], activatedBonusLetters: const [0],
activatedDashNests: const {'1'}, activatedDashNests: const {'1'},
bonusHistory: const [GameBonus.word], bonusHistory: const [GameBonus.word],
@ -225,7 +194,6 @@ void main() {
gameState.copyWith( gameState.copyWith(
score: otherGameState.score, score: otherGameState.score,
balls: otherGameState.balls, balls: otherGameState.balls,
bonusBalls: otherGameState.bonusBalls,
activatedBonusLetters: otherGameState.activatedBonusLetters, activatedBonusLetters: otherGameState.activatedBonusLetters,
activatedDashNests: otherGameState.activatedDashNests, activatedDashNests: otherGameState.activatedDashNests,
bonusHistory: otherGameState.bonusHistory, bonusHistory: otherGameState.bonusHistory,

@ -262,7 +262,6 @@ void main() {
const state = GameState( const state = GameState(
score: 0, score: 0,
balls: 2, balls: 2,
bonusBalls: 0,
activatedBonusLetters: [0], activatedBonusLetters: [0],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -291,7 +290,6 @@ void main() {
const state = GameState( const state = GameState(
score: 0, score: 0,
balls: 2, balls: 2,
bonusBalls: 0,
activatedBonusLetters: [0], activatedBonusLetters: [0],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],
@ -335,7 +333,6 @@ void main() {
final state = GameState( final state = GameState(
score: 0, score: 0,
balls: 2, balls: 2,
bonusBalls: 0,
activatedBonusLetters: [index], activatedBonusLetters: [index],
activatedDashNests: const {}, activatedDashNests: const {},
bonusHistory: const [], bonusHistory: const [],

@ -86,7 +86,6 @@ void main() {
const state = GameState( const state = GameState(
score: 0, score: 0,
balls: 3, balls: 3,
bonusBalls: 1,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [GameBonus.dashNest], bonusHistory: [GameBonus.dashNest],

@ -1,7 +1,5 @@
// ignore_for_file: cascade_invocations // ignore_for_file: cascade_invocations
import 'dart:math';
import 'package:flame/components.dart'; import 'package:flame/components.dart';
import 'package:flame/game.dart'; import 'package:flame/game.dart';
import 'package:flame_test/flame_test.dart'; import 'package:flame_test/flame_test.dart';

@ -12,7 +12,6 @@ void main() {
const initialState = GameState( const initialState = GameState(
score: 10, score: 10,
balls: 2, balls: 2,
bonusBalls: 0,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],

@ -87,7 +87,6 @@ void main() {
const state = GameState( const state = GameState(
score: 0, score: 0,
balls: 0, balls: 0,
bonusBalls: 0,
activatedBonusLetters: [], activatedBonusLetters: [],
activatedDashNests: {}, activatedDashNests: {},
bonusHistory: [], bonusHistory: [],

Loading…
Cancel
Save