X-Git-Url: https://git.sesse.net/?p=remoteglot;a=blobdiff_plain;f=Position.pm;h=b720116ca2c7aeff24efa6f90ba74001807f22ac;hp=272cadb78d2124275556e16df5bc7403b19cbe6d;hb=b152d77b071ee91ab291a636e651356ea42d98a6;hpb=65aa4e3d31851a0b504f55ec9907b4fe4f9f8966 diff --git a/Position.pm b/Position.pm index 272cadb..b720116 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'} = $x[24]; - $pos->{'black_clock'} = $x[25]; + $pos->{'white_clock'} = _parse_fics_clock($x[24]); + $pos->{'black_clock'} = _parse_fics_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; @@ -50,6 +50,39 @@ sub start_pos { return $class->new("<12> rnbqkbnr pppppppp -------- -------- -------- -------- PPPPPPPP RNBQKBNR W -1 1 1 1 1 0 dummygamenum $white $black -2 dummytime dummyincrement 39 39 dummytime dummytime 1 none (0:00) none 0 0 0"); } +sub from_fen { + my ($class, $fen) = @_; + my ($board, $toplay, $castling, $ep_square, $halfmove_clock, $fullmove_clock) = split / /, $fen; + + my $pos = {}; + $board =~ s/(\d)/"-"x$1/ge; + $pos->{'board'} = Board->new(split /\//, $board); + $pos->{'toplay'} = uc($toplay); + + if ($ep_square =~ /^([a-h])/) { + $pos->{'ep_file_num'} = ord($1) - ord('a'); + } else { + $pos->{'ep_file_num'} = -1; + } + + $pos->{'white_castle_k'} = ($castling =~ /K/) ? 1 : 0; + $pos->{'white_castle_q'} = ($castling =~ /Q/) ? 1 : 0; + $pos->{'black_castle_k'} = ($castling =~ /k/) ? 1 : 0; + $pos->{'black_castle_q'} = ($castling =~ /q/) ? 1 : 0; + $pos->{'time_since_100move_rule_reset'} = $halfmove_clock // 0; + $pos->{'player_w'} = 'white'; + $pos->{'player_b'} = 'black'; + $pos->{'white_clock'} = 0; + $pos->{'black_clock'} = 0; + $pos->{'move_num'} = $fullmove_clock // 0; + $pos->{'last_move_uci'} = undef; + $pos->{'last_move'} = undef; + $pos->{'prettyprint_cache'} = {}; + + bless $pos, $class; + return $pos; +} + sub fen { my $pos = shift; @@ -267,4 +300,18 @@ 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;