]> git.sesse.net Git - remoteglot/blob - book/parse-pgn.pl
Clean up module usage in parse-pgn.pl.
[remoteglot] / book / parse-pgn.pl
1 #! /usr/bin/perl
2 use Chess::PGN::Parse;
3 use Data::Dumper;
4 use strict;
5 use warnings;
6 use lib '..';
7 use Position;
8 use Engine;
9 use ECO;
10
11 my $TEXTOUT = 0;
12 my $BINOUT = 1;
13
14 ECO::init();
15
16 my ($filename, $my_num, $tot_num) = @ARGV;
17
18 my $pgn = Chess::PGN::Parse->new($filename)
19         or die "can't open $filename\n";
20 my $game_num = 0;
21 while ($pgn->read_game()) {
22         next unless ($game_num++ % $tot_num == $my_num);
23         my $tags = $pgn->tags();
24 #       next unless $tags->{'WhiteElo'} >= 2000;
25 #       next unless $tags->{'BlackElo'} >= 2000;
26         $pgn->quick_parse_game;
27         my $pos = Position->start_pos($pgn->white, $pgn->black);
28         my $result = $pgn->result;
29         my $binresult;
30         if ($result eq '1-0') {
31                 $binresult = chr(0);
32         } elsif ($result eq '1/2-1/2') {
33                 $binresult = chr(1);
34         } elsif ($result eq '0-1') {
35                 $binresult = chr(2);
36         } else {
37                 die "Unknown result $result";
38         }
39         my $binwhiteelo = pack('l', $tags->{'WhiteElo'});
40         my $binblackelo = pack('l', $tags->{'BlackElo'});
41         my $moves = $pgn->moves;
42         my $opening = ECO::get_opening_num($pos);
43 #       print STDERR $pgn->white, " ", $pgn->black, "\n";
44         for (my $i = 0; $i + 1 < scalar @$moves; ++$i) {
45                 my ($from_row, $from_col, $to_row, $to_col, $promo) = $pos->parse_pretty_move($moves->[$i]);
46                 my $next_move = $moves->[$i];
47                 my $bpfen = $pos->bitpacked_fen;
48                 my $fen = $pos->fen;
49                 $opening = ECO::get_opening_num($pos) // $opening;
50                 print "$fen $next_move $result $opening\n" if $TEXTOUT;
51                 if ($BINOUT) {
52                         print chr(length($bpfen) + length($next_move)) . $bpfen . $next_move;
53                         print $binresult . $binwhiteelo . $binblackelo;
54                         print pack('l', $opening);
55                 }
56                 $pos = $pos->make_move($from_row, $from_col, $to_row, $to_col, $promo, $moves->[$i]);
57         }
58 }