112 lines
3.0 KiB
C
112 lines
3.0 KiB
C
#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;
|
|
}
|