#include "fen.hpp" #include "board.hpp" #include #include #include #include bool WHITE = true; bool BLACK = false; void setBoardFen(std::string fen, Game *g) { // example fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 int file = 0; int rank = 0; enum parserState { POSITION, TURN, CASTLE, ENPASSANT, CLOCK1, CLOCK2, }; parserState state = POSITION; for (uint i = 0; i < fen.length(); i++) { if (fen[i] == ' ') { if (state == POSITION) { state = TURN; continue; } if (state == TURN) { state = CASTLE; continue; } if (state == CASTLE) { state = ENPASSANT; continue; } if (state == ENPASSANT) { state = CLOCK1; continue; } if (state == CLOCK1) { state = CLOCK2; continue; } } if (state == ENPASSANT) { continue; } if (state == CASTLE) { if (fen[i] == '-') { g->blackCastleKing = false; g->blackCastleQueen = false; g->whiteCastleKing = false; g->whiteCastleQueen = false; continue; } if (fen[i] == 'K') { g->whiteCastleKing = true; continue; } if (fen[i] == 'Q') { g->whiteCastleQueen = true; continue; } if (fen[i] == 'k') { g->blackCastleKing = true; continue; } if (fen[i] == 'q') { g->blackCastleQueen = true; continue; } } if (state == TURN) { if (toupper(fen[i]) == 'W') { g->turn = WHITE; continue; } if (toupper(fen[i]) == 'B') { g->turn = BLACK; continue; } } if (state == POSITION) { if (isdigit(fen[i])) { int move = fen[i] - '0'; file += move; if (file > 8) { std::println("Fatal: file was to big"); exit(1); return; // malformed rank } continue; } if (fen[i] == '/') { file = 0; rank++; if (rank >= 8) { std::println("Fatal: rank was to big"); exit(1); return; // malformed rank } continue; }; if (toupper(fen[i]) == 'N') { Piece piece = createPiece(KNIGHT, isupper(fen[i])); g->pieces[rank * 8 + file] = piece; file++; continue; }; if (toupper(fen[i]) == 'R') { Piece piece = createPiece(ROOK, isupper(fen[i])); g->pieces[rank * 8 + file] = piece; file++; continue; } if (toupper(fen[i]) == 'Q') { Piece piece = createPiece(QUEEN, isupper(fen[i])); g->pieces[rank * 8 + file] = piece; file++; continue; } if (toupper(fen[i]) == 'B') { Piece piece = createPiece(BISHOP, isupper(fen[i])); g->pieces[rank * 8 + file] = piece; file++; continue; } if (toupper(fen[i]) == 'P') { Piece piece = createPiece(PAWN, isupper(fen[i])); g->pieces[rank * 8 + file] = piece; file++; continue; } if (toupper(fen[i]) == 'K') { Piece piece = createPiece(KING, isupper(fen[i])); g->pieces[rank * 8 + file] = piece; file++; continue; } } break; } UpdateBitboards(g); }