import 'dart:convert'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:mchess/api/move.dart'; import 'package:mchess/api/websocket_message.dart'; import 'package:mchess/chess_bloc/chess_events.dart'; import 'package:mchess/chess_bloc/chess_position.dart'; import 'package:mchess/connection/ws_connection.dart'; import 'package:mchess/utils/chess_utils.dart'; import 'dart:developer'; class ChessBloc extends Bloc { static final ChessBloc _instance = ChessBloc._internal(); static ChessColor turnColor = ChessColor.white; static ChessColor? myColor; static ChessColor? getSidesColor() { return myColor; } ChessBloc._internal() : super(ChessBoardState.init()) { on(initBoard); on(flipBoard); on(opponentMoveHandler); on(ownMoveHandler); } factory ChessBloc.getInstance() { return ChessBloc(); } factory ChessBloc() { return _instance; } void initBoard(InitBoard event, Emitter emit) { ChessPosition.getInstance().resetToStartingPosition(); emit(ChessBoardState(ChessColor.white, ChessColor.white, ChessPosition.getInstance().currentPosition)); } void flipBoard(ColorDetermined event, Emitter emit) { log("My Color is $myColor"); myColor = event.myColor; emit(ChessBoardState(event.myColor, state.newTurnColor, state.position)); } void opponentMoveHandler( OpponentPieceMoved event, Emitter emit) { log('opponentMoveHandler()'); ChessPosition.getInstance().recordMove(event.startSquare, event.endSquare); var newPosition = ChessPosition.getInstance().currentPosition; turnColor = state.newTurnColor == ChessColor.white ? ChessColor.black : ChessColor.white; emit( ChessBoardState( state.bottomColor, turnColor, newPosition, ), ); } void ownMoveHandler(OwnPieceMoved event, Emitter emit) { log('ownMoveHandler()'); ChessPosition.getInstance().recordMove(event.startSquare, event.endSquare); var start = ApiCoordinate( col: event.startSquare.column, row: event.startSquare.row); var end = ApiCoordinate(col: event.endSquare.column, row: event.endSquare.row); var move = ApiMove(startSquare: start, endSquare: end); var message = ApiWebsocketMessage(type: MessageType.move, move: move, color: null); ServerConnection.getInstance().send(jsonEncode(message)); turnColor = state.newTurnColor == ChessColor.white ? ChessColor.black : ChessColor.white; var newPosition = ChessPosition.getInstance().currentPosition; emit( ChessBoardState( state.bottomColor, turnColor, 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; ChessPosition.getInstance().resetToStartingPosition(); return ChessBoardState( bottomColor, turnColor, ChessPosition.getInstance().currentPosition); } void logPosition(Map pos) { // for (int i = 0; i < 7; i++) } }