- $pos->{'white_castle_k'} = ($castling =~ /K/) ? 1 : 0;
- $pos->{'white_castle_q'} = ($castling =~ /Q/) ? 1 : 0;
- $pos->{'black_castle_k'} = ($castling =~ /k/) ? 1 : 0;
- $pos->{'black_castle_q'} = ($castling =~ /q/) ? 1 : 0;
+ # X-FEN castling rights parsing.
+ if ($castling =~ /K/) {
+ $pos->{'white_castle_k'} = _col_num_to_letter(_find_piece_col_from_right($board->[7], 'R'));
+ }
+ if ($castling =~ /Q/) {
+ $pos->{'white_castle_q'} = _col_num_to_letter(_find_piece_col($board->[7], 'R'));
+ }
+ while ($castling =~ s/([A-H])//) {
+ my $rook_col = lc($1);
+ my $king_col = _col_num_to_letter(_find_piece_col($board->[7], 'K'));
+ if ($rook_col lt $king_col) {
+ $pos->{'white_castle_q'} = $rook_col;
+ } else {
+ $pos->{'white_castle_k'} = $rook_col;
+ }
+ }
+ if ($castling =~ /k/) {
+ $pos->{'black_castle_k'} = _col_num_to_letter(_find_piece_col_from_right($board->[0], 'r'));
+ }
+ if ($castling =~ /q/) {
+ $pos->{'black_castle_q'} = _col_num_to_letter(_find_piece_col($board->[0], 'r'));
+ }
+ while ($castling =~ s/([a-h])//) {
+ my $rook_col = $1;
+ my $king_col = _col_num_to_letter(_find_piece_col($board->[0], 'k'));
+ if ($rook_col lt $king_col) {
+ $pos->{'black_castle_q'} = $rook_col;
+ } else {
+ $pos->{'black_castle_k'} = $rook_col;
+ }
+ }