X-Git-Url: https://git.sesse.net/?p=remoteglot;a=blobdiff_plain;f=Board.pm;h=921de3d9c45f715e7084796aeb1a005bc5270093;hp=d2a6e0e425f7b48c8584c47e07e1692fd42ab604;hb=052ebfb43732a3a14a439bb1528e93d4c3b4a54b;hpb=0a124edc28c716548327826127a9145da091a3d0 diff --git a/Board.pm b/Board.pm index d2a6e0e..921de3d 100644 --- a/Board.pm +++ b/Board.pm @@ -148,6 +148,8 @@ sub move_to_uci_notation { return _pos_to_square($from_row, $from_col) . _pos_to_square($to_row, $to_col) . $promo; } +# Note: This is in general not a validation that the move is actually allowed +# (e.g. you can castle even though you're in check). sub parse_pretty_move { my ($board, $move, $toplay) = @_; @@ -192,14 +194,18 @@ sub parse_pretty_move { for my $col (0..7) { next if (defined($from_col) && $from_col != $col); next if ($board->[$row][$col] ne $piece); - next if (!$board->can_reach($piece, $row, $col, $to_row, $to_col)); - - # See if doing this move would put us in check - # (yes, there are clients that expect us to do this). - next if ($board->make_move($row, $col, $to_row, $to_col, $promo)->in_check($side)); push @squares, [ $row, $col ]; } } + if (scalar @squares > 1) { + # Filter out pieces which cannot reach this square. + @squares = grep { $board->can_reach($piece, $_->[0], $_->[1], $to_row, $to_col) } @squares; + } + if (scalar @squares > 1) { + # See if doing this move would put us in check + # (yes, there are clients that expect us to do this). + @squares = grep { !$board->make_move($_->[0], $_->[1], $to_row, $to_col, $promo)->in_check($side) } @squares; + } if (scalar @squares == 0) { die "Impossible move $move"; }