import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:mchess/chess_bloc/chess_events.dart'; import 'package:mchess/utils/chess_utils.dart'; import 'dart:developer'; class ChessBloc extends Bloc { static final ChessBloc _instance = ChessBloc._internal(); static ChessColor? myColor; static ChessColor? getSidesColor() { return myColor; } ChessBloc._internal() : super(ChessBoardState.init()) { on(initBoard); on(flipBoard); on(moveHandler); } factory ChessBloc.getInstance() { return ChessBloc(); } factory ChessBloc() { return _instance; } void initBoard(InitBoard event, Emitter emit) { emit(ChessBoardState.init()); } void flipBoard(ColorDetermined event, Emitter emit) { log("My Color is $myColor"); myColor = event.myColor; emit(ChessBoardState(event.myColor, state.newTurnColor, state.position)); } void moveHandler(PieceMoved event, Emitter emit) { Map newPosition = state.position; newPosition[event.endSquare] = state.position[event.startSquare]!; newPosition[event.startSquare] = const ChessPiece.none(); var newTurnColor = state.newTurnColor == ChessColor.white ? ChessColor.black : ChessColor.white; log('emitting new state with position $newPosition'); emit( ChessBoardState( state.bottomColor, newTurnColor, newPosition, ), ); } } class ChessBoardState { late ChessColor bottomColor; final ChessColor newTurnColor; final Map position; ChessBoardState._(this.bottomColor, this.newTurnColor, this.position); factory ChessBoardState( ChessColor bottomColor, ChessColor turnColor, Map position, ) { return ChessBoardState._(bottomColor, turnColor, position); } factory ChessBoardState.init() { ChessColor bottomColor = ChessColor.white; ChessColor turnColor = ChessColor.white; Map position = {}; for (int i = 1; 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)] = 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.white); position[ChessCoordinate(2, 1)] = ChessPiece(ChessPieceName.whiteKnight, ChessColor.white); position[ChessCoordinate(3, 1)] = ChessPiece(ChessPieceName.whiteBishop, ChessColor.white); position[ChessCoordinate(4, 1)] = ChessPiece(ChessPieceName.whiteQueen, ChessColor.white); position[ChessCoordinate(5, 1)] = ChessPiece(ChessPieceName.whiteKing, ChessColor.white); position[ChessCoordinate(6, 1)] = ChessPiece(ChessPieceName.whiteBishop, ChessColor.white); position[ChessCoordinate(7, 1)] = ChessPiece(ChessPieceName.whiteKnight, ChessColor.white); position[ChessCoordinate(8, 1)] = ChessPiece(ChessPieceName.whiteRook, ChessColor.white); return ChessBoardState._(bottomColor, turnColor, position); } void logPosition(Map pos) { // for (int i = 0; i < 7; i++) } }