X-Git-Url: https://git.sesse.net/?p=remoteglot;a=blobdiff_plain;f=Position.pm;h=3e39e46f0f09ed2d762b6e3f3eca002b800e974b;hp=3e3e84fd3f0282d55878f1a47ca3d215277c0000;hb=refs%2Fheads%2Fmaster;hpb=7c3edf71232cb453a4ed3f3053d0064ee7dabe24 diff --git a/Position.pm b/Position.pm index 3e3e84f..9e9fe29 100644 --- a/Position.pm +++ b/Position.pm @@ -191,6 +191,8 @@ sub fen { 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'}; @@ -275,8 +277,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;