int eval_full_eval(Board* board) { int score = 0; score += evaluate_piece(board->pieces[WHITE_PAWN], pieceSquareValues[WHITE_PAWN], pieceValues[WHITE_PAWN]); score += evaluate_piece(board->pieces[WHITE_KNIGHT], pieceSquareValues[WHITE_KNIGHT], pieceValues[WHITE_KNIGHT]); score += evaluate_piece(board->pieces[WHITE_BISHOP], pieceSquareValues[WHITE_BISHOP], pieceValues[WHITE_BISHOP]); score += evaluate_piece(board->pieces[WHITE_ROOK], pieceSquareValues[WHITE_ROOK], pieceValues[WHITE_ROOK]); score += evaluate_piece(board->pieces[WHITE_QUEEN], pieceSquareValues[WHITE_QUEEN], pieceValues[WHITE_QUEEN]); score += evaluate_piece(board->pieces[WHITE_KING], pieceSquareValues[WHITE_KING], pieceValues[WHITE_KING]); score -= evaluate_piece(board->pieces[BLACK_KING], pieceSquareValues[BLACK_KING], pieceValues[BLACK_KING]); score -= evaluate_piece(board->pieces[BLACK_QUEEN], pieceSquareValues[BLACK_QUEEN], pieceValues[BLACK_QUEEN]); score -= evaluate_piece(board->pieces[BLACK_ROOK], pieceSquareValues[BLACK_ROOK], pieceValues[BLACK_ROOK]); score -= evaluate_piece(board->pieces[BLACK_BISHOP], pieceSquareValues[BLACK_BISHOP], pieceValues[BLACK_BISHOP]); score -= evaluate_piece(board->pieces[BLACK_KNIGHT], pieceSquareValues[BLACK_KNIGHT], pieceValues[BLACK_KNIGHT]); score -= evaluate_piece(board->pieces[BLACK_PAWN], pieceSquareValues[BLACK_PAWN], pieceValues[BLACK_PAWN]); if(board->sideToMove == BLACK) { return -score; } return score; }
void load_fen(char* fen) { clear_board(); char* ptr = fen; uint8_t rank = 7; uint8_t file = 0; do { switch (*ptr) { case 'K': fill_square(WHITE, KING, SQUARE(rank, file)); file++; break; case 'Q': fill_square(WHITE, QUEEN, SQUARE(rank, file)); file++; break; case 'R': fill_square(WHITE, ROOK, SQUARE(rank, file)); file++; break; case 'B': fill_square(WHITE, BISHOP, SQUARE(rank, file)); file++; break; case 'N': fill_square(WHITE, KNIGHT, SQUARE(rank, file)); file++; break; case 'P': fill_square(WHITE, PAWN, SQUARE(rank, file)); file++; break; case 'k': fill_square(BLACK, KING, SQUARE(rank, file)); file++; break; case 'q': fill_square(BLACK, QUEEN, SQUARE(rank, file)); file++; break; case 'r': fill_square(BLACK, ROOK, SQUARE(rank, file)); file++; break; case 'b': fill_square(BLACK, BISHOP, SQUARE(rank, file)); file++; break; case 'n': fill_square(BLACK, KNIGHT, SQUARE(rank, file)); file++; break; case 'p': fill_square(BLACK, PAWN, SQUARE(rank, file)); file++; break; case '/': rank--; file = 0; break; case '1': file += 1; break; case '2': file += 2; break; case '3': file += 3; break; case '4': file += 4; break; case '5': file += 5; break; case '6': file += 6; break; case '7': file += 7; break; case '8': file += 8; break; }; ptr++; } while (*ptr != ' '); ptr++; if (*ptr == 'w') { b.stm = WHITE; } else { b.stm = BLACK; } ptr += 2; b.flags = 0; do { switch (*ptr) { case 'K': b.flags |= CASTLE_WK; break; case 'Q': b.flags |= CASTLE_WQ; break; case 'k': b.flags |= CASTLE_BK; break; case 'q': b.flags |= CASTLE_BQ; break; } ptr++; } while (*ptr != ' '); ptr++; if (*ptr != '-') { uint8_t file = ptr[0] - 'a'; uint8_t rank = ptr[1] - '1'; b.ep = SQUARE(rank, file); } do { ptr++; } while (*ptr != ' '); ptr++; int ply = 0; sscanf(ptr, "%d", &ply); b.ply = ply; positions[b.ply] = b.hash; for (square_t sq = 0; sq < 128; sq++) { if (!IS_SQUARE(sq)) continue; if (b.pieces[sq] != PIECE_EMPTY) { b.material_score += evaluate_piece(b.colors[sq], b.pieces[sq], sq); } } }