$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;