if ($castling =~ /Q/) {
$pos->{'white_castle_q'} = _col_num_to_letter(_find_piece_col($board->[7], 'R'));
}
- while ($castling =~ s/([A-H])//g) {
+ while ($castling =~ s/([A-H])//) {
my $rook_col = lc($1);
- my $king_col = _find_piece_col($board->[7], 'K');
- if ($rook_col < $king_col) {
- $pos->{'white_castle_q'} = _col_num_to_letter($rook_col);
+ 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'} = _col_num_to_letter($rook_col);
+ $pos->{'white_castle_k'} = $rook_col;
}
}
if ($castling =~ /k/) {
if ($castling =~ /q/) {
$pos->{'black_castle_q'} = _col_num_to_letter(_find_piece_col($board->[0], 'r'));
}
- while ($castling =~ s/([a-h])//g) {
+ while ($castling =~ s/([a-h])//) {
my $rook_col = $1;
- my $king_col = _find_piece_col($board->[0], 'k');
- if ($rook_col < $king_col) {
- $pos->{'black_castle_q'} = _col_num_to_letter($rook_col);
+ 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'} = _col_num_to_letter($rook_col);
+ $pos->{'black_castle_k'} = $rook_col;
}
}
$pos->{'time_since_100move_rule_reset'} = $halfmove_clock // 0;
sub to_json_hash {
my $pos = shift;
my $json = { %$pos, fen => $pos->fen() };
+ delete $json->{'toplay'};
+ delete $json->{'move_num'};
delete $json->{'board'};
delete $json->{'prettyprint_cache'};
delete $json->{'tbprobe_cache'};
$np->{'black_castle_k'} = undef;
}
- # 50-move rule.
- if (lc($piece) eq 'p' || $dest_piece ne '-') {
+ # 50-move rule. Note that castle does not reset the counter, per FIDE rules.
+ my $castling = (lc($piece) eq 'k' && abs($from_col - $to_col) > 1) || # King moves two squares.
+ ($piece eq 'K' && $dest_piece eq 'R') || # Chess960-style king-takes-rook.
+ ($piece eq 'k' && $dest_piece eq 'r');
+ if (!$castling && (lc($piece) eq 'p' || $dest_piece ne '-')) {
$np->{'time_since_100move_rule_reset'} = 0;
} else {
$np->{'time_since_100move_rule_reset'} = $pos->{'time_since_100move_rule_reset'} + 1;