import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:quiver/core.dart'; enum ChessPieceName { none, whitePawn, whiteBishop, whiteKnight, whiteRook, whiteQueen, whiteKing, blackPawn, blackBishop, blackKnight, blackRook, blackQueen, blackKing, } enum ChessColor { black, white } Map chessPiecesAssets = { ChessPieceName.whitePawn: 'assets/pieces/white/pawn.svg', ChessPieceName.whiteBishop: 'assets/pieces/white/bishop.svg', ChessPieceName.whiteKnight: 'assets/pieces/white/knight.svg', ChessPieceName.whiteRook: 'assets/pieces/white/rook.svg', ChessPieceName.whiteQueen: 'assets/pieces/white/queen.svg', ChessPieceName.whiteKing: 'assets/pieces/white/king.svg', ChessPieceName.blackPawn: 'assets/pieces/black/pawn.svg', ChessPieceName.blackBishop: 'assets/pieces/black/bishop.svg', ChessPieceName.blackKnight: 'assets/pieces/black/knight.svg', ChessPieceName.blackRook: 'assets/pieces/black/rook.svg', ChessPieceName.blackQueen: 'assets/pieces/black/queen.svg', ChessPieceName.blackKing: 'assets/pieces/black/king.svg', ChessPieceName.none: 'assets/empty.svg', }; class ChessCoordinate { late int column; late int row; ChessCoordinate(this.column, this.row); ChessCoordinate.copyFrom(ChessCoordinate original) : column = original.column, row = original.row; static String columnIntToColumnString(int col) { String colStr; colStr = String.fromCharCode(col + 96); return colStr; } static int columnStringToColumnInt(String col) { int colInt; colInt = col.codeUnitAt(0) - 96; return colInt; } @override operator ==(other) { return other is ChessCoordinate && other.column == column && other.row == row; } @override int get hashCode { return hash2(column, row); } } class ChessPiece extends StatelessWidget { final ChessColor color; final ChessPieceName pieceName; final Widget? pieceImage; const ChessPiece._(this.pieceName, this.color, this.pieceImage); factory ChessPiece(ChessPieceName name, ChessColor color) { Widget? pieceImage; String pieceAssetUrl = chessPiecesAssets[name]!; pieceImage = SvgPicture.asset(pieceAssetUrl); return ChessPiece._(name, color, pieceImage); } const ChessPiece.none({super.key}) : pieceName = ChessPieceName.none, color = ChessColor.white, pieceImage = null; @override Widget build(BuildContext context) { return SizedBox( child: pieceImage, ); } } class ChessMove { ChessCoordinate startSquare; ChessCoordinate endSquare; ChessPiece? movedPiece; ChessPiece? pieceOnEndSquare; ChessMove(this.startSquare, this.endSquare, this.movedPiece); }