mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 08:43:09 +00:00
Simplify from_fen()
No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
62cd133b3a
commit
b85bcc039c
1 changed files with 17 additions and 27 deletions
|
@ -181,7 +181,7 @@ void Position::from_fen(const string& fen, bool c960) {
|
||||||
A FEN string contains six fields. The separator between fields is a space. The fields are:
|
A FEN string contains six fields. The separator between fields is a space. The fields are:
|
||||||
|
|
||||||
1) Piece placement (from white's perspective). Each rank is described, starting with rank 8 and ending
|
1) Piece placement (from white's perspective). Each rank is described, starting with rank 8 and ending
|
||||||
with rank 1; within each rank, the contents of each square are described from file a through file h.
|
with rank 1; within each rank, the contents of each square are described from file A through file H.
|
||||||
Following the Standard Algebraic Notation (SAN), each piece is identified by a single letter taken
|
Following the Standard Algebraic Notation (SAN), each piece is identified by a single letter taken
|
||||||
from the standard English names. White pieces are designated using upper-case letters ("PNBRQK")
|
from the standard English names. White pieces are designated using upper-case letters ("PNBRQK")
|
||||||
while Black take lowercase ("pnbrqk"). Blank squares are noted using digits 1 through 8 (the number
|
while Black take lowercase ("pnbrqk"). Blank squares are noted using digits 1 through 8 (the number
|
||||||
|
@ -206,31 +206,24 @@ void Position::from_fen(const string& fen, bool c960) {
|
||||||
char token;
|
char token;
|
||||||
int hmc, fmn;
|
int hmc, fmn;
|
||||||
std::istringstream ss(fen);
|
std::istringstream ss(fen);
|
||||||
Rank rank = RANK_8;
|
Square sq = SQ_A8;
|
||||||
File file = FILE_A;
|
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
// 1. Piece placement field
|
// 1. Piece placement field
|
||||||
while (ss.get(token) && token != ' ')
|
while (ss.get(token) && token != ' ')
|
||||||
{
|
{
|
||||||
if (isdigit(token))
|
if (pieceLetters.find(token) != pieceLetters.end())
|
||||||
{
|
{
|
||||||
file += File(token - '0'); // Skip the given number of files
|
put_piece(pieceLetters[token], sq);
|
||||||
continue;
|
sq++;
|
||||||
}
|
}
|
||||||
|
else if (isdigit(token))
|
||||||
|
sq += Square(token - '0'); // Skip the given number of files
|
||||||
else if (token == '/')
|
else if (token == '/')
|
||||||
{
|
sq -= SQ_A3; // Jump back of 2 rows
|
||||||
file = FILE_A;
|
else
|
||||||
rank--;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pieceLetters.find(token) == pieceLetters.end())
|
|
||||||
goto incorrect_fen;
|
goto incorrect_fen;
|
||||||
|
|
||||||
put_piece(pieceLetters[token], make_square(file, rank));
|
|
||||||
file++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. Active color
|
// 2. Active color
|
||||||
|
@ -244,24 +237,20 @@ void Position::from_fen(const string& fen, bool c960) {
|
||||||
|
|
||||||
// 3. Castling availability
|
// 3. Castling availability
|
||||||
while (ss.get(token) && token != ' ')
|
while (ss.get(token) && token != ' ')
|
||||||
{
|
|
||||||
if (token == '-')
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!set_castling_rights(token))
|
if (!set_castling_rights(token))
|
||||||
goto incorrect_fen;
|
goto incorrect_fen;
|
||||||
}
|
|
||||||
|
|
||||||
// 4. En passant square -- ignore if no capture is possible
|
// 4. En passant square
|
||||||
char col, row;
|
char col, row;
|
||||||
if ( (ss.get(col) && (col >= 'a' && col <= 'h'))
|
if ( (ss.get(col) && (col >= 'a' && col <= 'h'))
|
||||||
&& (ss.get(row) && (row == '3' || row == '6')))
|
&& (ss.get(row) && (row == '3' || row == '6')))
|
||||||
{
|
{
|
||||||
Square fenEpSquare = make_square(file_from_char(col), rank_from_char(row));
|
st->epSquare = make_square(file_from_char(col), rank_from_char(row));
|
||||||
Color them = opposite_color(sideToMove);
|
|
||||||
|
|
||||||
if (attacks_from<PAWN>(fenEpSquare, them) & pieces(PAWN, sideToMove))
|
// Ignore if no capture is possible
|
||||||
st->epSquare = fenEpSquare;
|
Color them = opposite_color(sideToMove);
|
||||||
|
if (!(attacks_from<PAWN>(st->epSquare, them) & pieces(PAWN, sideToMove)))
|
||||||
|
st->epSquare = SQ_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5. Halfmove clock
|
// 5. Halfmove clock
|
||||||
|
@ -347,7 +336,8 @@ bool Position::set_castling_rights(char token) {
|
||||||
initialKRFile = rookFile;
|
initialKRFile = rookFile;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else return false;
|
else
|
||||||
|
return token == '-';
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue