]> git.sesse.net Git - remoteglot/blobdiff - Position.pm
When something goes wrong, actually wait five seconds instead of DoSing the backend.
[remoteglot] / Position.pm
index 93bde53d334670e64a114f9881545ae37be8f987..3e39e46f0f09ed2d762b6e3f3eca002b800e974b 100644 (file)
@@ -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;