X-Git-Url: https://git.sesse.net/?p=remoteglot;a=blobdiff_plain;f=Board.pm;h=d2a6e0e425f7b48c8584c47e07e1692fd42ab604;hp=2edc07de0c61a37b93ebee9e5aadd73fe29985e2;hb=0a124edc28c716548327826127a9145da091a3d0;hpb=2e02751eebe4f5ed406e0f61c6f6eadae0193a41 diff --git a/Board.pm b/Board.pm index 2edc07d..d2a6e0e 100644 --- a/Board.pm +++ b/Board.pm @@ -200,8 +200,11 @@ sub parse_pretty_move { push @squares, [ $row, $col ]; } } + if (scalar @squares == 0) { + die "Impossible move $move"; + } if (scalar @squares != 1) { - die "Ambigious or impossible move $move"; + die "Ambigious move $move"; } return (@{$squares[0]}, $to_row, $to_col, $promo); } @@ -218,6 +221,45 @@ sub fen { return join('/', @rows); } +# Returns a compact bit string describing the same data as fen(). +# This is encoded using a Huffman-like encoding, and should be +# typically about 1/3 the number of bytes. +sub bitpacked_fen { + my ($board) = @_; + my $bits = ""; + + for my $row (0..7) { + for my $col (0..7) { + my $piece = $board->[$row][$col]; + if ($piece eq '-') { + $bits .= "0"; + next; + } + + my $color = (lc($piece) eq $piece) ? 0 : 1; + $bits .= "1" . $color; + + if (lc($piece) eq 'p') { + $bits .= "0"; + } elsif (lc($piece) eq 'n') { + $bits .= "100"; + } elsif (lc($piece) eq 'b') { + $bits .= "101"; + } elsif (lc($piece) eq 'r') { + $bits .= "1110"; + } elsif (lc($piece) eq 'q') { + $bits .= "11110"; + } elsif (lc($piece) eq 'k') { + $bits .= "11111"; + } else { + die "Unknown piece $piece"; + } + } + } + + return pack('b*', $bits); +} + sub can_reach { my ($board, $piece, $from_row, $from_col, $to_row, $to_col) = @_;