#include "fen_strings.h" #include "game_state.h" #include "string.h" #include "assert.h" char fen_string[200]; int fen_idx = 0; static void fen_append(char val) { assert(fen_idx < (int)sizeof(fen_string)); fen_string[fen_idx] = val; fen_idx++; } char * fen_string_get_state(void) { memset(fen_string, (int)' ', sizeof(fen_string)); fen_idx = 0; Game_State_t * state = Board_get_game_state(); for (int row = 0; row < 8; row++) { int consec_empty = 0; for (int column = 0; column < 8; column++) { if((state->board_pieces[row * 8 + column] == SQUARE_EMPTY)) { consec_empty++; if (column == 7) { fen_append((char)('0' + consec_empty)); } } else { char ret_val; if (consec_empty != 0) { fen_append((char)('0' + consec_empty)); consec_empty = 0; } switch (state->board_pieces[row * 8 + column]) { case PAWN_WHITE: fen_append('P'); break; case PAWN_BLACK: fen_append('p'); break; case KING_WHITE: fen_append('K'); break; case KING_BLACK: fen_append('k'); break; case ROOK_WHITE: fen_append('R'); break; case ROOK_BLACK: fen_append('r'); break; case KNIGHT_WHITE: fen_append('N'); break; case KNIGHT_BLACK: fen_append('n'); break; case BISHOP_WHITE: fen_append('B'); break; case BISHOP_BLACK: fen_append('b'); break; case QUEEN_WHITE: fen_append('Q'); break; case QUEEN_BLACK: fen_append('q'); break; } } } fen_append('/'); } fen_append(' '); if (state->player_turn) { fen_append('w'); } else{ fen_append('b'); } fen_append(' '); char options[2][2] = {{'K', 'Q'}, {'k', 'q'}}; bool castle = false; for(int color = 0; color < 2; color++){ for(int k_q = 0; k_q < 2; k_q++){ if(state->castling_allowed[color][k_q]) { castle = true; fen_append(options[color][k_q]); } } } if (!castle) { fen_append('-'); } fen_append(' '); fen_append('\0'); return fen_string; }