chess_board_sim/src/game_logic/fen_strings.c

112 lines
3.0 KiB
C
Raw Normal View History

2024-09-18 21:00:39 -04:00
#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'}};
2024-09-18 21:04:00 -04:00
bool castle = false;
2024-09-18 21:00:39 -04:00
for(int color = 0; color < 2; color++){
for(int k_q = 0; k_q < 2; k_q++){
if(state->castling_allowed[color][k_q])
{
2024-09-18 21:04:00 -04:00
castle = true;
2024-09-18 21:00:39 -04:00
fen_append(options[color][k_q]);
}
}
}
if (!castle) {
fen_append('-');
}
fen_append(' ');
fen_append('\0');
return fen_string;
}