X-Git-Url: https://git.sesse.net/?p=remoteglot;a=blobdiff_plain;f=Position.pm;h=3e39e46f0f09ed2d762b6e3f3eca002b800e974b;hp=93bde53d334670e64a114f9881545ae37be8f987;hb=e961331f0f08ba475f53599442c0d330bd520c91;hpb=6dd4f0d4b11f86cc8490bbb0462259232fa80a7a diff --git a/Position.pm b/Position.pm index 93bde53..3e39e46 100644 --- a/Position.pm +++ b/Position.pm @@ -74,13 +74,13 @@ sub from_fen { 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/) { @@ -89,13 +89,13 @@ sub from_fen { 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; @@ -275,8 +275,11 @@ sub make_move { $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;