mchess-client/lib/chess_bloc/chess_bloc.dart

117 lines
3.9 KiB
Dart
Raw Normal View History

2022-11-13 00:03:09 +00:00
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:mchess/chess_bloc/chess_events.dart';
2022-11-13 00:03:09 +00:00
import 'package:mchess/chessapp/chess_utils.dart';
import 'dart:developer';
2022-11-13 00:03:09 +00:00
class ChessBloc extends Bloc<ChessEvent, ChessBoardState> {
static final ChessBloc _instance = ChessBloc._internal();
2022-12-18 00:04:08 +00:00
late ChessColor? myColor;
2022-11-13 00:03:09 +00:00
ChessBloc._internal() : super(ChessBoardState.init()) {
2022-12-18 00:04:08 +00:00
on<InitBoard>(initBoard);
on<ColorDetermined>(flipBoard);
2022-11-13 00:03:09 +00:00
on<PieceMoved>(moveHandler);
}
factory ChessBloc.getInstance() {
return ChessBloc();
}
factory ChessBloc() {
return _instance;
}
2022-12-18 00:04:08 +00:00
void initBoard(InitBoard event, Emitter<ChessBoardState> emit) {
emit(ChessBoardState.init());
}
void flipBoard(ColorDetermined event, Emitter<ChessBoardState> emit) {
emit(ChessBoardState(event.myColor, state.newTurnColor, state.position));
}
void moveHandler(PieceMoved event, Emitter<ChessBoardState> emit) {
Map<ChessCoordinate, ChessPiece> newPosition = state.position;
2022-11-13 02:24:42 +00:00
newPosition[event.endSquare] = state.position[event.startSquare]!;
newPosition[event.startSquare] = const ChessPiece.none();
2022-12-18 00:04:08 +00:00
var newTurnColor = state.newTurnColor == ChessColor.white
? ChessColor.black
: ChessColor.white;
2022-12-18 00:04:08 +00:00
log('emitting new state with position $newPosition');
emit(
ChessBoardState(
state.bottomColor,
newTurnColor,
newPosition,
),
);
}
2022-11-13 00:03:09 +00:00
}
class ChessBoardState {
2022-12-18 00:04:08 +00:00
late ChessColor bottomColor;
final ChessColor newTurnColor;
2022-11-13 00:03:09 +00:00
final Map<ChessCoordinate, ChessPiece> position;
2022-12-18 00:04:08 +00:00
ChessBoardState._(this.bottomColor, this.newTurnColor, this.position);
factory ChessBoardState(
2022-12-18 00:04:08 +00:00
ChessColor bottomColor,
ChessColor turnColor,
Map<ChessCoordinate, ChessPiece> position,
) {
2022-12-18 00:04:08 +00:00
return ChessBoardState._(bottomColor, turnColor, position);
}
factory ChessBoardState.init() {
2022-12-18 00:04:08 +00:00
ChessColor bottomColor = ChessColor.white;
ChessColor turnColor = ChessColor.white;
Map<ChessCoordinate, ChessPiece> position = {};
2022-11-13 00:03:09 +00:00
for (int i = 0; i <= 8; i++) {
position[ChessCoordinate(i, 7)] =
ChessPiece(ChessPieceName.blackPawn, ChessColor.black);
position[ChessCoordinate(i, 2)] =
ChessPiece(ChessPieceName.whitePawn, ChessColor.white);
}
position[ChessCoordinate(1, 8)] =
ChessPiece(ChessPieceName.blackRook, ChessColor.black);
position[ChessCoordinate(2, 8)] =
ChessPiece(ChessPieceName.blackKnight, ChessColor.black);
position[ChessCoordinate(3, 8)] =
ChessPiece(ChessPieceName.blackBishop, ChessColor.black);
position[ChessCoordinate(4, 8)] =
ChessPiece(ChessPieceName.blackQueen, ChessColor.black);
position[ChessCoordinate(5, 8)] =
2022-11-13 02:42:30 +00:00
ChessPiece(ChessPieceName.blackKing, ChessColor.black);
position[ChessCoordinate(6, 8)] =
ChessPiece(ChessPieceName.blackBishop, ChessColor.black);
position[ChessCoordinate(7, 8)] =
ChessPiece(ChessPieceName.blackKnight, ChessColor.black);
position[ChessCoordinate(8, 8)] =
ChessPiece(ChessPieceName.blackRook, ChessColor.black);
position[ChessCoordinate(1, 1)] =
ChessPiece(ChessPieceName.whiteRook, ChessColor.black);
position[ChessCoordinate(2, 1)] =
ChessPiece(ChessPieceName.whiteKnight, ChessColor.black);
position[ChessCoordinate(3, 1)] =
ChessPiece(ChessPieceName.whiteBishop, ChessColor.black);
position[ChessCoordinate(4, 1)] =
ChessPiece(ChessPieceName.whiteQueen, ChessColor.black);
position[ChessCoordinate(5, 1)] =
ChessPiece(ChessPieceName.whiteKing, ChessColor.black);
position[ChessCoordinate(6, 1)] =
ChessPiece(ChessPieceName.whiteBishop, ChessColor.black);
position[ChessCoordinate(7, 1)] =
ChessPiece(ChessPieceName.whiteKnight, ChessColor.black);
position[ChessCoordinate(8, 1)] =
ChessPiece(ChessPieceName.whiteRook, ChessColor.black);
2022-12-18 00:04:08 +00:00
return ChessBoardState._(bottomColor, turnColor, position);
}
2022-11-13 00:03:09 +00:00
}