X-Git-Url: https://git.sesse.net/?p=remoteglot;a=blobdiff_plain;f=Position.pm;h=8a42a6fa39f59f9e42bd80ec08bb5d7719a759e7;hp=b720116ca2c7aeff24efa6f90ba74001807f22ac;hb=bdf7fb246fa3fcf64350d8edd3f3a9ea9c32f46f;hpb=b152d77b071ee91ab291a636e651356ea42d98a6 diff --git a/Position.pm b/Position.pm index b720116..8a42a6f 100644 --- a/Position.pm +++ b/Position.pm @@ -28,8 +28,8 @@ sub new { $pos->{'player_b'} = $x[18]; $pos->{'player_w'} =~ s/^W?[FCIG]M//; $pos->{'player_b'} =~ s/^W?[FCIG]M//; - $pos->{'white_clock'} = _parse_fics_clock($x[24]); - $pos->{'black_clock'} = _parse_fics_clock($x[25]); + $pos->{'white_clock'} = $x[24]; + $pos->{'black_clock'} = $x[25]; $pos->{'move_num'} = $x[26]; if ($x[27] =~ /([a-h][1-8])-([a-h][1-8])/) { $pos->{'last_move_uci'} = $1 . $2; @@ -38,6 +38,7 @@ sub new { } $pos->{'last_move'} = $x[29]; $pos->{'prettyprint_cache'} = {}; + $pos->{'tbprobe_cache'} = {}; bless $pos, $class; return $pos; @@ -78,6 +79,7 @@ sub from_fen { $pos->{'last_move_uci'} = undef; $pos->{'last_move'} = undef; $pos->{'prettyprint_cache'} = {}; + $pos->{'tbprobe_cache'} = {}; bless $pos, $class; return $pos; @@ -130,40 +132,12 @@ sub fen { return $fen; } -# Returns a compact bit string describing the same data as fen(), -# except for the half-move and full-move clock. -sub bitpacked_fen { - my $pos = shift; - my $board = $pos->{'board'}->bitpacked_fen(); - - my $bits = ""; - if ($pos->{'toplay'} eq 'W') { - $bits .= "0"; - } else { - $bits .= "1"; - } - - $bits .= $pos->{'white_castle_k'}; - $bits .= $pos->{'white_castle_q'}; - $bits .= $pos->{'black_castle_k'}; - $bits .= $pos->{'black_castle_q'}; - - my $col = $pos->{'ep_file_num'}; - if ($col == -1) { - $bits .= "0"; - } else { - $bits .= "1"; - $bits .= (qw(000 001 010 011 100 101 110 111))[$col]; - } - - return $board . pack('b*', $bits); -} - sub to_json_hash { my $pos = shift; my $json = { %$pos, fen => $pos->fen() }; delete $json->{'board'}; delete $json->{'prettyprint_cache'}; + delete $json->{'tbprobe_cache'}; delete $json->{'black_castle_k'}; delete $json->{'black_castle_q'}; delete $json->{'white_castle_k'}; @@ -244,6 +218,12 @@ sub make_move { } $np->{'player_w'} = $pos->{'player_w'}; $np->{'player_b'} = $pos->{'player_b'}; + if (exists($pos->{'start_fen'})) { + $np->{'start_fen'} = $pos->{'start_fen'}; + } + if (exists($pos->{'chess960'})) { + $np->{'chess960'} = $pos->{'chess960'}; + } if (defined($pretty_move)) { $np->{'last_move'} = $pretty_move; } else { @@ -265,6 +245,11 @@ sub make_pretty_move { return ($pos, $uci_move); } +sub is_chess960 { + my ($pos) = shift; + return (defined($pos->{'chess960'}) && $pos->{'chess960'}); +} + sub _pos_to_square { my ($row, $col) = @_; return sprintf("%c%d", ord('a') + $col, 8 - $row); @@ -300,18 +285,4 @@ sub _parse_uci_move { return ($from_row, $from_col, $to_row, $to_col, $promo); } -sub _parse_fics_clock { - my $x = shift; - if ($x =~ /^\d+$/) { - my $s = $x % 60; - $x = ($x - $s) / 60; - my $m = $x % 60; - $x = ($x - $m) / 60; - my $h = $x; - return sprintf "%02d:%02d:%02d", $h, $m, $s; - } else { - return $x; - } -} - 1;